﻿using System;
using System.Collections.Generic;
using System.Diagnostics.Contracts;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Text;
using SimpleData.Infrastructure;
using SimpleData.Infrastructure.Plugins;
using SimpleData.Infrastructure.Serialization;

namespace SimpleData.ObjectModel.Design
{
	/// <summary>
	/// Representa um tipo
	/// </summary>
	public abstract class FieldTypeDescriptor : IRuleBuilderFactory //: DataObjectNameBase
	{

		/// <summary>
		/// Inicializa um novo tipo
		/// </summary>
		/// <param name="typeName"></param>
		protected FieldTypeDescriptor( FieldTypeName typeName )
		{
			Contract.Requires<ArgumentNullException>( typeName != null, "typeName" );

			this.Name = typeName;
		}


		/// <summary>
		/// Obtém ou define o nome que identifica um tipo no sistema
		/// </summary>
		public FieldTypeName Name
		{ get; private set; }

		/// <summary>
		/// Obtém ou define o nome do tipo, que será exibido para o usuário
		/// </summary>
		public string DisplayName
		{ get; set; }

		/// <summary>
		/// Cria uma nova regra para 
		/// </summary>
		/// <returns></returns>
		public virtual FieldTypeRule NewTypeRule()
		{
			return new FieldTypeRule( this.Name );
		}

		/// <summary>
		/// Obtém o objeto utilizado para realiza a conversão do campo
		/// </summary>
		/// <param name="field"></param>
		/// <returns></returns>
		public abstract IFieldTypeConverter CreateConverter( FieldDescriptor field );

		#region IRuleBuilderFactory Members

		public abstract IRuleBuilder CreateRuleBuilder( Rule data );

		#endregion
	}
}
	
